#include <REGX52.H>

sbit OneWire_DQ=P3^7;

/*********************************************************************
	方法：OneWire
	参数：
	返回值：0 有从机；1 无从机
*/
unsigned char OneWire_Init()
{
	unsigned char i,AckBit;
	OneWire_DQ=1;				//DQ由高拉低
	OneWire_DQ=0;
	i=247;while(--i);			//Delay 500us
	OneWire_DQ=1;				//主机释放DQ
	
	i=32;while(--i);			//Delay 5us
	AckBit=OneWire_DQ;			//从机应答
	
	i=247;while(--i);			//Delay 500us
	return AckBit;
}

/*********************************************************************
	方法：发送1位
	参数：
	返回值：无
*/
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	OneWire_DQ=0;			//首先拉低DQ
	i=4;while(--i);			//Delay 10us
	OneWire_DQ=Bit;
	i=24;while(--i);		//Delay 50us	
	OneWire_DQ=1;			//最后拉高DQ
}

/*********************************************************************
	方法：接收一位
	参数：
	返回值：接收的数据
*/
unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i,Bit;
	OneWire_DQ=0;			//首先拉低DQ
	i=2;while(--i);			//Delay 5us
	OneWire_DQ=1;			//主机释放DQ
	i=2;while(--i);			//Delay 5us
	Bit=OneWire_DQ;			//读取DQ
	i=24;while(--i);		//Delay 50us	
	//这里不需要释放总线，总线由从机释放
	return Bit;
}

/*********************************************************************
	方法：发送一个字节
	参数：发送的字节
	返回值：无
*/
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}

/*********************************************************************
	方法：接收一个字节
	参数：
	返回值：接收到的字节
*/
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i, Byte;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit())
		{
			Byte|=(0x01<<i);
		}
	}
	return Byte;
}